﻿#pragma once
#include <string>
#include <vector>


class Holiday;

class HolidayUtil
{
public:
	/// <summary>
	/// 节假日名称（元旦0，春节1，清明2，劳动3，端午4，中秋5，国庆6，国庆中秋7，抗战胜利日8）
	/// </summary>
	static const std::vector<std::string>  NAMES;

	/// <summary>
	/// 获取指定年月日的节假日信息，如果不存在，返回null
	/// </summary>
	/// <param name="year">年</param>
	/// <param name="month">月，1-12</param>
	/// <param name="day">日，1-31</param>
	/// <returns>节假日</returns>
	static Holiday* GetHoliday(int year, int month, int day);


	/// <summary>
	/// 获取指定年月日的节假日信息，如果不存在，返回null
	/// </summary>
	/// <param name="ymd">年月日</param>
	/// <returns>节假日</returns>
	static Holiday* GetHoliday(std::string ymd);

	/// <summary>
	/// 获取指定年月的节假日列表
	/// </summary>
	/// <param name="year">年</param>
	/// <param name="month">月，1-12</param>
	/// <returns>节假日列表</returns>
	static std::vector<Holiday> GetHolidays(int year, int month);

	/// <summary>
	/// 获取指定年的节假日列表
	/// </summary>
	/// <param name="year">年</param>
	/// <returns>节假日列表</returns>
	static  std::vector<Holiday> GetHolidays(int year);


	/// <summary>
	/// 获取指定年月日的节假日列表
	/// </summary>
	/// <param name="ymd">年、年月、年月日</param>
	/// <returns>节假日列表</returns>
	static std::vector<Holiday> GetHolidays(std::string ymd);


	/// <summary>
	/// 获取指定节日（仅节日当天）的相关节假日列表
	/// </summary>
	/// <param name="ymd">年月日</param>
	/// <returns>节假日列表</returns>
	static std::vector<Holiday> GetHolidaysByTarget(std::string ymd);


	/// <summary>
	/// 获取指定节日（仅节日当天）的相关节假日列表
	/// </summary>
	/// <param name="year">年</param>
	/// <param name="month">月</param>
	/// <param name="day">日</param>
	/// <returns>节假日列表</returns>
	static std::vector<Holiday> GetHolidaysByTarget(int year, int month, int day);

	/// <summary>
	/// 修正或追加节假日数据。节假日名称下标从0开始，超过9的，按ASCII码表依次往后排列；调休标识0为上班，否则放假
	/// </summary>
	/// <param name="names">用于替换默认的节假日名称列表，传null即可使用默认名称</param>
	/// <param name="data">需要修正或追加的节假日数据，每18位表示1天依次排列，格式：当天年月日YYYYMMDD(8位)+节假日名称下标(1位)+调休标识(1位)+节假日当天YYYYMMDD(8位)。例：202005023120200501代表2020-05-02为劳动节放假，对应节假日为2020-05-01</param>
	static void Fix(std::vector<std::string>* names, std::string* data);

	/// <summary>
	/// 使用默认的节假日名称来修正或追加节假日数据。节假日名称下标从0开始，最大为8(元旦节0，春节1，清明节2，劳动节3，端午节4，中秋节5，国庆节6，国庆中秋7，抗战胜利日8)；调休标识0为上班，否则放假
	/// </summary>
	/// <param name="data">需要修正或追加的节假日数据，每18位表示1天依次排列，格式：当天年月日YYYYMMDD(8位)+节假日名称下标(1位)+调休标识(1位)+节假日当天YYYYMMDD(8位)。例：202005023120200501代表2020-05-02为劳动节放假，对应节假日为2020-05-01</param>
	static void Fix(std::string data);

private:
	/// <summary>
		/// 数据段长度
		/// </summary>
	static const int SIZE;

	/// <summary>
	/// 0
	/// </summary>
	static const char ZERO;

	/// <summary>
	/// 删除标识
	/// </summary>
	static const std::string TAG_REMOVE;

	/// <summary>
	/// 节假日数据，日期YYYYMMDD+名称下标+是否调休+对应节日YYYYMMDD
	/// </summary>
	static const std::string DATA;


	/// <summary>
	/// 使用的节假日名称
	/// </summary>
	static std::vector<std::string>  NAMES_IN_USE;

	/// <summary>
	/// 使用的节假日数据
	/// </summary>
	static std::string DATA_IN_USE;

	static Holiday* BuildHolidayForward(std::string s);

	static Holiday* BuildHolidayBackward(std::string s);

	static std::string FindForward(const std::string& key);

	static std::string FindBackward(const std::string& key);

	static std::vector<Holiday> FindHolidaysForward(std::string key);

	static std::vector<Holiday> FindHolidaysBackward(std::string key);



};

